#!/bin/bash
set -e  # 遇到错误立即退出

# 配置文件路径
MIRRORS_CONF="/etc/docker/mirrors.json"
DAEMON_CONF="/etc/docker/daemon.json"
BACKUP_CONF="$DAEMON_CONF.bak"  # 备份文件路径

# 检查jq是否安装
check_jq() {
  if ! command -v jq &> /dev/null; then
    echo "错误：未安装jq工具，请先运行以下命令安装："
    echo "sudo apt install jq -y （Debian/Ubuntu）"
    echo "sudo yum install jq -y （CentOS/RHEL）"
    exit 1
  fi
}

# 检查镜像源配置文件是否存在
check_conf() {
  if [ ! -f "$MIRRORS_CONF" ]; then
    echo "错误：镜像源配置文件 $MIRRORS_CONF 不存在"
    echo "请创建该文件并添加镜像源映射，格式如下："
    echo '{
  "ustc": "https://docker.mirrors.ustc.edu.cn",
  "aliyun": "https://xxx.mirror.aliyuncs.com"
}'
    exit 1
  fi
}

# 列出所有可用镜像源
list_mirrors() {
  echo "可用镜像源列表："
  current_mirror=$(get_current_mirror)

  jq -r 'keys[]' "$MIRRORS_CONF" | while read -r src; do
    src_url=$(jq -r ".[\"$src\"]" "$MIRRORS_CONF")
    if [ "$src_url" == "$current_mirror" ]; then
      echo "  * $src: $src_url"
    else
      echo "    $src: $src_url"
    fi
  done
}

# 获取当前镜像源
# daemon.json中的地址无斜杠，docker info中的地址有斜杠
get_current_mirror() {
  if [ -f "$DAEMON_CONF" ]; then
    # 获取当前镜像源并规范化（添加末尾斜杠）
    current_mirror=$(jq -r '.["registry-mirrors"][0] // empty' "$DAEMON_CONF")
    echo "$current_mirror" | sed 's#/*$#/#'  # 规范化
  else
    echo ""
  fi
}

# 显示当前激活的镜像源
show_current() {
  current_mirror=$(get_current_mirror)
  if [ -z "$current_mirror" ]; then
    echo "当前未配置镜像源，使用默认Docker Hub"
  else
    echo "当前激活的镜像源：$current_mirror"
  fi
}

switch_mirror() {
  local src_name="$1"

  # 检查源是否存在
  if ! jq --arg src "$src_name" 'has($src)' "$MIRRORS_CONF" | grep -q "true"; then
    echo "错误：镜像源 '$src_name' 不存在，请使用 list 命令查看可用源"
    exit 1
  fi

  # 获取镜像源URL并规范化（添加末尾斜杠）
  new_mirror=$(jq -r ".[\"$src_name\"]" "$MIRRORS_CONF")
  new_mirror=$(echo "$new_mirror" | sed 's#/*$#/#')  # 规范化：确保末尾有斜杠

  # 备份当前配置（如果存在）
  if [ -f "$DAEMON_CONF" ]; then
    sudo cp "$DAEMON_CONF" "$BACKUP_CONF"
    echo "已备份当前配置到 $BACKUP_CONF"
  fi

  # 创建新的daemon.json（保留其他配置）
  echo "正在切换到镜像源: $src_name ($new_mirror)"

  if [ -f "$DAEMON_CONF" ]; then
    # 保留原有配置，只更新registry-mirrors（使用规范化后的地址）
    sudo jq --arg mirror "$new_mirror" \
      '.["registry-mirrors"] = [$mirror]' \
      "$DAEMON_CONF" > /tmp/daemon.tmp
  else
    # 创建新的daemon.json（使用规范化后的地址）
    echo "{\"registry-mirrors\": [\"$new_mirror\"]}" > /tmp/daemon.tmp
  fi

  # 移动临时文件到目标位置
  sudo mv /tmp/daemon.tmp "$DAEMON_CONF"

  # 优化：强制刷新缓存+重新加载systemd配置+重启
  echo "正在重启Docker服务..."
  sudo sync  # 强制写入磁盘
  sudo systemctl daemon-reload  # 重新加载systemd配置
  sudo systemctl restart docker  # 重启服务

  # 验证是否切换成功（使用规范化后的地址匹配）
  #if docker info 2>/dev/null | grep -q "Registry Mirrors:.*${new_mirror}"; then
  if docker info 2>/dev/null | grep -A 10 "Registry Mirrors:" | grep -q "${new_mirror}"; then
    echo "成功切换到镜像源：$src_name"
    show_current
  else
    echo "错误：切换失败，请检查Docker服务状态"
    echo "您可以恢复备份: sudo cp $BACKUP_CONF $DAEMON_CONF"
    exit 1
  fi
}

# 重置功能：恢复备份文件
reset_config() {
    if [ -f "$BACKUP_CONF" ]; then
        sudo cp -f "$BACKUP_CONF" "$DAEMON_CONF"
        echo "✅ 已恢复备份配置: $BACKUP_CONF → $DAEMON_CONF"
        reload_docker
    else
        echo "❌ 备份文件 $BACKUP_CONF 不存在，无法恢复"
        exit 1
    fi
}

# 重载Docker服务并验证配置
reload_docker() {
    echo "🔄 重新加载Docker配置..."
    sudo systemctl daemon-reload
    sudo systemctl restart docker

    # 检查Docker状态
    if ! systemctl is-active --quiet docker; then
        echo "❌ Docker服务启动失败，请检查日志: journalctl -u docker"
        exit 1
    fi

    # 打印镜像源信息
    echo "📡 当前镜像源配置:"
    sudo docker info | grep "Registry Mirrors" -A 10
}


# 显示帮助信息
show_help() {
  echo "Docker镜像源管理工具"
  echo "用法：sudo ./docker-images.sh [命令]"
  echo "命令列表："
  echo "  list      列出所有可用镜像源（*标记当前源）"
  echo "  current   显示当前激活的镜像源"
  echo "  use <源名称>  切换到指定镜像源（如：sudo ./docker-images.sh use aliyun）"
  echo "  reset     恢复配置"
  echo "  help      显示帮助信息"
}


# 主逻辑
check_jq
check_conf

case "$1" in
  list)
    list_mirrors
    ;;
  current)
    show_current
    ;;
  use)
    if [ -z "$2" ]; then
      echo "错误：请指定要切换的镜像源名称（如：sudo ./docker-images.sh use aliyun）"
      exit 1
    fi
    switch_mirror "$2"
    ;;
  reset)
	reset_config
	;;
  help)
    show_help
    ;;
  *)
	# 备份原始配置（仅首次运行）
	if [ ! -f "$BACKUP_FILE" ]; then
		sudo cp "$CONFIG_FILE" "$BACKUP_FILE"
		echo "📦 已创建备份: $BACKUP_FILE"
	fi

	# 此处可添加您的原有逻辑（例如修改镜像源）
	# 示例：修改镜像源（根据实际需求调整）
	# echo '{ "registry-mirrors": ["https://new.mirror.url"] }' | sudo tee "$CONFIG_FILE"

	# 重载配置并验证
	reload_docker
	;;
esac